package co.baiku.boot.core.orm.service;


import co.baiku.boot.common.message.PageData;
import co.baiku.boot.core.orm.dto.mapper.IMapper;
import co.baiku.boot.core.orm.request.PagingRequest;
import co.baiku.boot.core.orm.request.SearchGroup;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public interface BaseService<T, D, ID extends Serializable> {
    /**
     * 新增或更新对象
     *
     * @param entity 对象实体
     */
    T saveOrUpdate(T entity);

    default int dynamicUpdate(T entity) {
        return 0;
    }

    /**
     * 批量保存
     *
     * @param entites 对象实体列表
     */
    int batchInsert(Collection<T> entites);

    /**
     * 批量更新
     *
     * @param entites 对象实体列表
     */
    int batchUpdate(Collection<T> entites);

    /**
     * 删除
     *
     * @param id
     */
    void delete(ID id);

    /**
     * 批量删除
     *
     * @param ids id列表
     */
    void delete(Collection<ID> ids);

    /**
     * 获取Entity对象
     *
     * @param id
     */
    T getById(ID id);

    /**
     * 获取dto对象
     *
     * @param id
     */
    D getDtoById(ID id);

    /**
     * 分页获取dto对象列表
     *
     * @param page      页码
     * @param rows      每页条数
     * @param searchMap 查询条件
     * @param sort      排序规则
     */
    PageData<D> findDtoPaging(Integer page, Integer rows, Map<String, Object> searchMap, Map<String, String> sort);

    /**
     * 分页获取dto对象列表
     *
     * @param page         页码
     * @param rows         每页条数
     * @param searchParams 查询条件
     * @param searchGroups 动态条件组
     * @param sort         排序规则
     */
    PageData<D> findDtoPaging(Integer page, Integer rows, Map<String, Object> searchParams, List<SearchGroup> searchGroups, Map<String, String> sort);


    /**
     * 分页获取dto对象列表
     *
     * @param pagingRequest 查询条件
     */
    PageData<D> findDtoPaging(PagingRequest pagingRequest);

    /**
     * 分页获取po对象列表
     *
     * @param pagingRequest 查询条件
     */
    PageData<T> findPaging(PagingRequest pagingRequest);

    /**
     * 获取所有实体
     */
    List<T> findAll();

    /**
     * 获取所有实体
     *
     * @param searchParams 查询条件
     */
    List<T> findAll(Map<String, Object> searchParams);

    /**
     * 获取所有实体
     *
     * @param searchParams 查询条件
     * @param sort         排序规则
     */
    List<T> findAll(Map<String, Object> searchParams, Map<String, String> sort);

    /**
     * 获取实体
     *
     * @param property 属性表达式
     * @param value    值
     */
    List<T> findByProperty(String property, Object value);

    /**
     * 获取实体
     *
     * @param property 属性表达式
     * @param value    值
     * @param sort     排序规则
     */
    List<T> findByProperty(String property, Object value, Map<String, String> sort);

    D toDto(T entity);

    List<D> toDto(List<T> entity);

    PageData<D> toDto(PageData<T> page);

    T toPo(D dto);

    List<T> toPo(List<D> dtos);

    void delete(T entity);

    void deleteAll(Collection<T> entity);

    List<T> findByIdIn(Collection<ID> ids);

    void deleteByProperty(String property,Object value);

    void deleteByParams(Map<String,Object> searchParams);

    IMapper<T,D> mapper();
}
